#include "myUart.h"
//#include	"STC8A_BMM.h"
//#include	"APP_BMM_UART.h"
#include  "crc.h"

uint8_t buf_toPC[6]={0x4A,0x43,0x00,0x00,0x42,0x09};
uint8_t cmdData[100];
uint8_t remoteData[13]={0};//遥控手柄数据
u8 cnt_remoteReceive;
void uartData_transmit(uint8_t huart,uint8_t *sendBuf,u8 sendLen)//串口数据发送
{
    u8 a=0;
    for(a = 0 ; a < sendLen ; a++)
    {
        if(huart == huart1)
        {
            TX1_write2buff(sendBuf[a]);
        }
        if(huart == huart2)
        {
            TX2_write2buff(sendBuf[a]);
        }
        if(huart == huart3)
        {
            TX3_write2buff(sendBuf[a]);
        }
        else if(huart == huart4)
        {
            TX4_write2buff(sendBuf[a]);
        }
    }
}

void transfer_remote(void)
{
	uartData_transmit(huart1,remoteData,13);
}
void sendToServer(uint16_t state)
{
	uint8_t state_buf[10] = {0x51, 0x48, 0x00, 0x0A, 0x40, 0x03, 0x00, 0x01, 0xE7, 0xDA};
	state_buf[6] = state>>8; state_buf[7] = state; state_buf[8] = SumCheck(state_buf,8);;
	uartData_transmit(huart1,state_buf,10);
}
u8 tempdata[100]={0};
void uartData_pack(uint8_t huart,u16 cmdID,u8 *TXmessage,u8 len)//串口数据打包
{
	u8 i=0;
	u8 exLen = 8; // 上位机协议固定8个字节，有效数据len个字节
	u8 tmp_sum;
	u8 tmp_5C[100] = {0};
	u8 cnt_5C=0;
//	u8 *tempdata = (u8 *)malloc(sizeof(u8) * (len + exLen));
	memcpy(tempdata, buf_toPC, 6); // 打包帧头和指令
	tempdata[3] = len + exLen;
	tempdata[len + exLen - 1] = 0xda; // 打包数据长度和帧尾
	tempdata[4] = cmdID >> 8 & 0xff;
	tempdata[5] = cmdID & 0xff;
	memcpy(&tempdata[6], TXmessage, len); // 打包数据
	tmp_sum = SumCheck(tempdata, len + exLen - 2);
	tempdata[len + exLen - 2] = tmp_sum; // 打包校验和
	for (i = 0; i < len + exLen; i++)
	{
		if (tempdata[i] == 0x3B)
		{
			cnt_5C++;
			if (cnt_5C == 1)
				memcpy(tmp_5C, tempdata, i);
			tmp_5C[i + cnt_5C - 1] = 0x5c;
			memcpy(tmp_5C + i + cnt_5C, tempdata + i, len + exLen - i);
		}
	}
	if(cnt_5C==0)uartData_transmit(huart, tempdata, len + exLen);
	else uartData_transmit(huart, tmp_5C, len + exLen+cnt_5C);
//	free(tempdata);
}

void uartData_process(u8 *buf,u16 id)//串口数据处理
{
	
	switch(id)
	{	
 		case 0x1000:	
 			printf("恢复出厂设置%d;",buf[0]);
// 			fuc_system_reset();
 			break;
		case 0x4060:			
			fuc_agv_setRun(buf);
			break;
		case 0x4061:			
			fuc_pwm_control(buf);
			break;
	}
}
myHandle hd;

uint16_t crc1;
void handle_receive(u8* buffer,u16 datalenth)//手柄处理
{
	if(buffer[3]==datalenth)//验证长度
	{
		crc1=ModbusCRC_CheckTableLH(buffer,11);
		if(((crc1>>8&0xff)==buffer[datalenth-2])&&((crc1&0xff)==buffer[datalenth-1]))//验证crc校验
		{
//				printf("hlly_手柄;");
			hd.AL1=buffer[5];
			hd.AL2=buffer[6];
			hd.AR1=buffer[7];
			hd.AR2=buffer[8];
			hd.L2=buffer[9]>>7&0x01;
			hd.L1=buffer[9]>>6&0x01;
			hd.LU=buffer[9]>>5&0x01;
			hd.LL=buffer[9]>>4&0x01;
			hd.LD=buffer[9]>>3&0x01;
			hd.LR=buffer[9]>>2&0x01;
			hd.SE=buffer[9]>>1&0x01;
			hd.ST=buffer[9]&0x01;
			hd.RL=buffer[10]>>7&0x01;
			hd.RD=buffer[10]>>6&0x01;
			hd.RR=buffer[10]>>5&0x01;
			hd.RU=buffer[10]>>4&0x01;
			hd.R1=buffer[10]>>3&0x01;
			hd.R2=buffer[10]>>2&0x01;
			hd.RK=buffer[10]>>1&0x01;
			hd.LK=buffer[10]&0x01;
			if(hd.SE)
			{
				hd.flag_onOff=0;
				printf("关闭手柄;");
			}
			if(hd.ST)
			{
				hd.flag_onOff=1;
				printf("开启手柄;");
			}
			if(hd.LU|hd.LL|hd.LD|hd.LR)
			{
				hd.mode=3;
				printf("持续运动模式;");//持续运动模式
			}
			else if(hd.RL|hd.RD|hd.RR|hd.RU)
			{
				hd.mode=4;
				printf("点动模式;");//点动模式
			}
			else if(hd.LK)
			{
				hd.mode=1;
				hd.AL1=0x7f;//摇杆回中
				hd.AL2=0x7f;
				printf("左摇杆模式;");//左摇杆模式
			}
			else if(hd.RK)
			{
				hd.mode=2;
				hd.AR1=0x7f;
				hd.AR2=0x7f;
				printf("右摇杆模式;");//右摇杆模式
			}
			handle_process();
		}
	}

}

void uartData_verify(u8* buffer,u16 len)//串口数据验证
{
	u8 sum;
	u16 cmdId;	
//	u8 i;

	sum=SumCheck(buffer,len-2);
	if(sum==buffer[len-2])//验证校验和
	{
//				printf("校验和为%bx;",sum);
		cmdId=buffer[4]<<8|buffer[5];	
		memset(cmdData,0,100);
		memcpy(cmdData, buffer+6, len-8);//有效数据拷贝出来并处理
//		uartData_pack(huart1,0x4000,&buffer[4],len-6);//收到数据回复
//		uartData_process(cmdData,cmdId,len-10);
		uartData_process(cmdData,cmdId);
//		for(i=0; i<len-8; i++)	TX3_write2buff(cmdData[i]);
	}
	
}

//void uartData_depart(u8* buffer,u16 datalenth) reentrant//串口数据拆分
void uartData_depart(u8* buffer,u8 datalenth)//串口数据拆分
{
	u16 len;
//	u8 sum;
	if(buffer[0]==0x50&buffer[1]==0x43)//验证上位机帧头
	{
//		printf("帧头;");
		len=buffer[2]<<8|buffer[3];
		if(len<datalenth)
		{
			// uartData_depart(buffer,len);
			// uartData_depart(&buffer[len-1],datalenth-len);

		}
		else if(len==datalenth)//验证数据长度
		{
//			printf("长度;");
			if(buffer[len-1]==0xda)//验证帧尾
			{
//				printf("帧尾;");
				uartData_verify(buffer,len);	
			}				
		}
	}
	else if(buffer[0]==0xAA&buffer[1]==0xAA)//验证手柄遥控器帧头
	{
		handle_receive(buffer,datalenth);
	}
}

void uartData_receive(void)//串口数据接收
{
	u8 i;
	if(COM1.RX_TimeOut > 0)
	{
		if(--COM1.RX_TimeOut == 0)
		{
			if(COM1.RX_Cnt > 0)
			{
				for(i=0; i<COM1.RX_Cnt; i++)	TX1_write2buff(RX1_Buffer[i]);	//收到的数据原样返回	
//				uartData_depart(&RX1_Buffer,COM1.RX_Cnt);	
//				UART_Transmit(huart1,RX1_Buffer,COM1.RX_Cnt);//返回接收数据
			}
			COM1.RX_Cnt = 0;
		}
	}
	if(COM3.RX_TimeOut > 0)
		{
			if(--COM3.RX_TimeOut == 0)
			{
				if(COM3.RX_Cnt > 0)
				{
					uartData_depart(&RX3_Buffer,COM3.RX_Cnt);
//					for(i=0; i<COM3.RX_Cnt; i++)	TX3_write2buff(RX3_Buffer[i]);	//收到的数据原样返回	
//					printf("hlly");
				}
				COM3.RX_Cnt = 0;
			}
		}
		
		if(COM4.RX_TimeOut > 0)
		{
			if(--COM4.RX_TimeOut == 0)
			{
				if(COM4.RX_Cnt > 0)
				{
					if(RX4_Buffer[0] == 0xAA && RX4_Buffer[1] == 0xAA&& RX4_Buffer[3] == 0x0D)
					{
//						memset(&remoteData,0,13);
//						memcpy(&remoteData[0], RX4_Buffer, 13); 
						cnt_remoteReceive++;
						if(cnt_remoteReceive>12)
						{
							cnt_remoteReceive=0;
							for(i=0; i<13; i++)	TX3_write2buff(RX4_Buffer[i]);//转发遥控器数据
						}
					}
				}
				COM4.RX_Cnt = 0;
			}
		}
}